package com.hyf.rabbitmq.routing;

import com.rabbitmq.client.*;

import java.io.IOException;
import java.util.concurrent.TimeoutException;

public class ReceiveLogsDirect1 {

    //采用直连路由
    private static String EXCHANGE_NAME="direct_logs";
    public static final String[] routingKeys=new String[]{"info","warning","error"};
    public static void main(String[] args){

        ConnectionFactory factory=new ConnectionFactory();
        factory.setHost("127.0.0.1");
        factory.setUsername("admin");
        factory.setPassword("12345");
        factory.setVirtualHost("/");
        factory.setPort(5672);
        //第二种连接方式
        //factory.setUri("amqp://userName:password@hostName:portNumber/virtualHost");
        Connection connection =null;
        Channel channel=null;
        try {
            connection = factory.newConnection();
            channel = connection.createChannel();
            /**
             * 前面创建的都是采用匿名交换器,现在主动创建交换器
             * 交换器列表
             * 通过rabbitmqctl list_exchanges指令列出服务器上所有可用的交换器
             * 这个列表里面所有以【amq.*】开头的交换器都是RabbitMQ默认创建的。在生产环境中，可以自己定义。
             *
             *第一个参数代表交换器名称，第二个参数代表处理消息的方式
             * 第二个参数的值，可以在BuiltinExchangeType 枚举类找到
             * direct （直连）
             * topic （主题）
             * headers （标题）
             * fanout （分发）也有翻译为扇出的。
             */

            channel.exchangeDeclare(EXCHANGE_NAME, BuiltinExchangeType.DIRECT.getType());
            /**
             * 第一个参数就是交换器的名称。如果输入“”空字符串，表示使用默认的匿名交换器。
             * 第二个参数是【routingKey】路由线索
             * 匿名交换器规则：
             * 发送到routingKey名称对应的队列。
             * channel.basicPublish("", "hello", null, message.getBytes());
             */
            String queueName = channel.queueDeclare().getQueue();
            //根据路由关键字进行多重绑定
            for(String severity:routingKeys){
                channel.queueBind(queueName,EXCHANGE_NAME,severity);
                System.out.println(String.format("ReceiveLogsDirect1 exchange:%s,queueName:%s,severity:%s",EXCHANGE_NAME,queueName,severity));
            }


            System.out.println("ReceiveLogsDirect1 [*] Waiting for messages. To exit press CTRL+C");

            Consumer consumer=new DefaultConsumer(channel){
                @Override
                public void handleDelivery(String consumerTag, Envelope envelope, AMQP.BasicProperties properties, byte[] body) throws IOException {
                    String message=new String(body,"utf-8");
                    System.out.println(String.format("[X1] received routingKey:%s message:%s",envelope.getRoutingKey(),message));
                }
            };
            channel.basicConsume(queueName,true,consumer);

        } catch (IOException e) {
            e.printStackTrace();
        } catch (TimeoutException e) {
            e.printStackTrace();
        } finally{
            /*if(channel!=null){
                try {
                    channel.close();
                } catch (IOException e) {
                    e.printStackTrace();
                } catch (TimeoutException e) {
                    e.printStackTrace();
                }
            }
            if(connection!=null){
                try {
                    connection.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }*/
        }
    }
}